package com.jxb.netty;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;

import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;

public class NettyDecoder extends LengthFieldBasedFrameDecoder {

    //maxFrameLength：16777216， lengthFieldOffset：0, lengthFieldLength：4, lengthAdjustment：0, initialBytesToStrip：4
    //maxFrameLength：包的最大长度：16777216
    //lengthFieldOffset：长度域的偏移量：0
    //lengthFieldLength：长度域的长度：4
    //lengthAdjustment：长度域中的数据总长度与数据真实大小不一样，所以需要进行调整，可正可负：0
    //initialBytesToStrip：解码过程需要丢失的长度：4
    //————————————————————             ———————————
    //| length   |   数据帧|      ————>|    数据帧   |
    //| 4bytes   |16777216|      ————>|  16777216  |
    //————————————————————             ————————————
    public NettyDecoder() {
        super(16777216, 0, 4, 0, 4);
//        super(2147483647, 0, 4, 0, 4);
    }

    @Override
    protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception {
        ByteBuf byteBuf = (ByteBuf) super.decode(ctx, in);
        if (byteBuf == null) {
            return null;
        }
        ByteBuffer buffer = byteBuf.nioBuffer();
        return RemotingCommand.decode(buffer);
    }
}
